#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "bool.h"

//#undef NDEBUG
//#define DEBUG_LEVEL 2
//#include "knl.dbg.dbg_debug.h"
#define debug(s) printf(s)

void rts_lib_init()
{
  debug(("rts_lib_init()\n"));
}

void rts_lib_final(bool in_exit_handler, bool abnormal_termination)
{
  debug(("rts_lib_final()\n"));

  if(in_exit_handler)
    debug(("  In exit handler\n"));
  else
    debug(("  Via atexit\n"));

  if(abnormal_termination)
    debug(("  Abnormal termination\n"));
  else
    debug(("  Normal termination\n"));
}

void atexit_fn_1()
{
  printf("atexit_fn() before static dtors\n");
}

void atexit_fn_2()
{
  printf("atexit_fn() after static dtors\n");
}

class StaticObject
{
  public:

    StaticObject();
    ~StaticObject();
};

StaticObject::StaticObject()
  {
    printf("StaticObject::StaticObject()\n");
    atexit(atexit_fn_2);
  }

StaticObject::~StaticObject()
  {
    printf("StaticObject::~StaticObject()\n");
  }

static StaticObject static_object_;

int main()
{
  atexit(atexit_fn_1);

  debug(("main()\n"));

//  exit(23);
//  abort();
//  raise(SIGABRT);
//  raise(SIGFPE);
//  raise(SIGILL);
//  raise(SIGINT);
//  raise(SIGSEGV);
//  raise(SIGTERM);
//  raise(SIGSTAK);
//  raise(SIGUSR1);
//  raise(SIGUSR2);
//  raise(SIGOSERROR);

//  double foo = 0;
//  double *foo_p = &foo;
//  double bar = 1/ *foo_p;

//  char* cp = (char*)0;
//  *cp = 0;

//  void (*f)(void) = (void (*)())0x13c;
//  f();

  debug(("main() returning\n"));
}
